本文基于 android-14.0.0_r15 版本讲解
英文缩写说明:
- AMS:ActivityManagerService
- ATMS:ActivityTaskManagerService
Android 在 Java 层弱化了进程的概念,建立了四大组件框架。这套框架中最核心的组件就是 AMS,在 Android10 及以后,AMS 的部分功能迁移到了 ATMS。接下来我们通过分析四大组件的启动过程来了解 AMS/ATMS 的内部实现。我们首先分析 Activity 的启动过程。
# 1. 整体流程
Activity 启动过程非常复杂,涉及多种情况的处理,有各种各样的分支,全盘分析很容易迷失在源码中,我们针对具体的 App 冷启动场景进行分析,梳理出主干流程:
- 使用 Android Studio 新建一个空项目,将其安装到模拟器中
- 点击 Launcher 中的图标,启动这个 App
Activity 的冷启动过程涉及到多个进程:
- 源 App 进程,一般是 Launcher
- SystemServer 进程
- Zygote 进程
- 目标 App 进程
启动的整体流程如下:
- 用户点击 App 图标,Launcher 进程启动目标 Activity
- SystemServer 中的 AMS/ATMS 收到请求,创建对应的 ActivityRecord 和 Task,并挂载到窗口层级树中
- AMS/ATMS pause 源 Activity
- 源 Activity pause 完成后,告知 AMS/ATMS pause 过程完成,AMS/ATMS 通知到 Zygote 创建新进程
- 目标 App 进程启动后,向 AMS/ATMS attach 当前进程信息
- AMS/ATMS 远程调用到 app ,app 初始化 Application,执行 onCreate 生命周期方法,初始化 Activity,执行 onCreate OnResume 等生命周期方法
# 2.Binder 通信通道
在分析代码之前我们需要了解 App(包括了源 App 与目标 App) 与 SystemServer 之间的 Binder 通信通道。
# 2.1 App 访问 ATMS
SystemServer 在启动时会注册一个 Java Binder 服务 ATMS:
// /frameworks/base/services/java/com/android/server/SystemServer.java
// # SystemServer
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
//......
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
//......
}
2
3
4
5
6
7
8
ATMS 的主要作用是作为服务端向客户端 App 提供管理 Activity 的接口:
startActivity
finishActivity
activityResumed
activityPaused
activityStopped
activityDestroyed
// ......
2
3
4
5
6
7
App 进程作为客户端通过 Binder RPC 调用到这些方法,实现 Activity 的管理:
ATMS 通过 AIDL 实现,相关类的类图如下:
# 2.2 ATMS 访问 App
在 App 进程启动的过程中,会初始化一个匿名 Java Binder 服务 ApplicationThread,ATMS 可以通过调用 ApplicationThread 的 Binder 客户端对象提供的接口,远程调用到 App 端,更新 Activity 的状态:
bindApplication
scheduleTransaction
scheduleLowMemory
scheduleSleeping
//......
2
3
4
5
此时,App 进程是服务端,SystemServer 是客户端。也就是说 App 和 SystemServer 互为客户端服务端。
ApplicationThread 同样基于 AIDL 实现,相关类的类图如下: